#!/bin/sh
# \
exec tclsh "$0" "$@"

proc create_top_and_clock_scripts { args } {

  set usageInfo {Usage:  create_top_and_clock_scripts
    -input_file <input_file1>               
   [-input_file <input_file2>]            
    ...

    -delete_delete_single_line_key_list <delete_one_line_keyword1> 
   [-delete_delete_single_line_key_list <delete_one_line_keyword2>]
   ...
    -delete_multiple_line_key_list <delete_lines_between_keyword1> 
   [-delete_multiple_line_key_list <delete_lines_between_keyword2>]
    ...
   [-keep_multiple_line_key_list <keep_lines_between_keyword1>]
   [-keep_multiple_line_key_list <keep_lines_between_keyword1>]
    ...
   [-substitute {<from_string1> <to_string1>}]
   [-substitute {<from_string2> <to_string2>}]
    ... 

    -output_file <output_file>
   }

  set input_file_list {}
  set output_file {}
  set delete_multi_line_key_list {}
  set delete_single_line_key_list {}
  set sub_key_list {}
  set keep_multi_line_key_list {}

  for {set i 0} {$i<[llength $args]} {incr i} {
    set arg [lindex $args $i]
    if {[string match "-h*" $arg]} {
       puts $usageInfo
       return
    } elseif {[string match "-in*" $arg]} {
       incr i
       lappend input_file_list [lindex $args $i]
    } elseif {[string match "-out*" $arg]} {
       incr i
       set output_file [lindex $args $i]
    } elseif {[string match "-delete_sin*" $arg]} {
       incr i
       lappend delete_single_line_key_list [lindex $args $i]
    } elseif {[string match "-delete_mul*" $arg]} {
       incr i
       lappend delete_multi_line_key_list [lindex $args $i]
    } elseif {[string match "-keep_mul*" $arg]} {
       incr i
       lappend keep_multi_line_key_list [lindex $args $i]
    } elseif {[string match "-sub*" $arg]} {
       incr i
       lappend sub_key_list [lindex $args $i]
    } else {
       puts "Error: Incorrect arguments"
       puts $usageInfo
       return
    }
  }

  foreach delete_multi_line_key $delete_multi_line_key_list {
    set remove_line_array($delete_multi_line_key) -1
  }

  foreach keep_multi_line_key $keep_multi_line_key_list {
    set keep_line_array($keep_multi_line_key) -1
  }

  set fp2 [open $output_file w]
  foreach input_file $input_file_list {
    puts "Input  File: $input_file"
    set fp [open $input_file r]
    while {[gets $fp line]>=0} {
      set remove_line -1
      foreach delete_multi_line_key $delete_multi_line_key_list {
        if {[regexp $delete_multi_line_key $line] != 0} {
          set remove_line_array($delete_multi_line_key) [expr $remove_line_array($delete_multi_line_key) * -1]
        }
        if { $remove_line_array($delete_multi_line_key) == 1} {
          set remove_line 1
        }
      }
      foreach keep_multi_line_key $keep_multi_line_key_list {
        if {[regexp $keep_multi_line_key $line] != 0} {
          set keep_line_array($keep_multi_line_key) [expr $keep_line_array($keep_multi_line_key) * -1]
        }
        if { $keep_line_array($keep_multi_line_key) == 1} {
          set remove_line -1
        }
      }
      if {$remove_line == -1} {
        if { $sub_key_list != {} } {
          foreach sub_key $sub_key_list {
            regsub -all [lindex $sub_key 0] $line [lindex $sub_key 1] line
          }
        }
        set print_line 1
        foreach delete_single_line_key $delete_single_line_key_list {
          if {[regexp $delete_single_line_key $line] != 0} {
            set print_line 0
          }
        }
        if { $print_line } {
          puts $fp2 $line
        }
      }
    }
    close $fp
  }
  close $fp2
  puts "Output File: $output_file"
  puts ""
}

# eval "create_top_and_clock_scripts $argv"
set scripts $env(ROOTDIR)/scripts

# Generate Top Implementation Script
catch {exec chmod +w $scripts/top_implementation.tcl} retVar
create_top_and_clock_scripts \
      -in $scripts/.block_and_top_master_script.tcl \
      -out $scripts/top_implementation.tcl \
      -delete_multi  {# @BLOCK_ONLY} \
      -delete_multi  {# @DTMF_FLAT_SCRIPT_ONLY} \
      -keep_multi    {# @TOP_ONLY} \
      -delete_single {# @} \
      -sub {{Block Implementation} {Top Implementation}}
exec chmod -w $scripts/top_implementation.tcl

# Generate Block Implementation Script
catch {exec chmod +w $scripts/block_implementation.tcl} retVar
create_top_and_clock_scripts \
      -in $scripts/.block_and_top_master_script.tcl \
      -out $scripts/block_implementation.tcl \
      -delete_multi  {# @TOP_ONLY} \
      -delete_multi  {# @DTMF_FLAT_SCRIPT_ONLY} \
      -keep_multi    {# @BLOCK_ONLY} \
      -delete_single {# @} 
exec chmod -w $scripts/block_implementation.tcl

# Generate Flat Implementation Script
catch {exec chmod +w $scripts/dtmf_flat.tcl} retVar
create_top_and_clock_scripts \
      -in $scripts/.virtual_prototyping_master_script.tcl \
      -in $scripts/.block_and_top_master_script.tcl \
      -out $scripts/dtmf_flat.tcl \
      -delete_multi  {# @BLOCK_ONLY} \
      -delete_multi  {# @TOP_ONLY} \
      -delete_multi  {# @NOT_IN_DTMF_FLAT_SCRIPT} \
      -delete_multi  {# @VIRTUAL_PROTOTYPING_ONLY} \
      -keep_multi    {# @DTMF_FLAT_SCRIPT_ONLY} \
      -delete_single {# @} \
      -sub {{\.enc} {.flat.enc}}
exec chmod -w $scripts/dtmf_flat.tcl

# Generate Virtual Prototyping Script
catch {exec chmod +w $scripts/virtual_prototyping.tcl} retVar
create_top_and_clock_scripts \
      -in $scripts/.virtual_prototyping_master_script.tcl \
      -out $scripts/virtual_prototyping.tcl \
      -delete_multi  {# @FLAT_SCRIPT_ONLY} \
      -delete_multi  {# @DTMF_FLAT_SCRIPT_ONLY} \
      -keep_multi    {# @VIRTUAL_PROTOTYPING_ONLY} \
      -delete_single {# @} 
exec chmod -w $scripts/virtual_prototyping.tcl
